package com.cskaoyan.javase.object._6clone.cloneable;

/**
 * "java.lang.Cloneable"
 * 该接口是一个空接口,里面没有定义任何成员,什么都没有
 * 所以某个类实现它,是不会报错的
 *
 * 那么它的作用是什么?
 * 一个类只有实现了"java.lang.Cloneable",才能允许做克隆操作
 * 不实现该接口,强行克隆,会抛出CloneNotSupportedException异常
 * 然后程序报错终止
 *
 * 那么这个接口,控制能够进行克隆操作,它是逻辑是什么样的呢?
 *
 *
 *
 * 某个类实现了一个接口,即便该接口没有任何成员,但是该类的数据类型也发生了变化:
 *      从不是该空接口的子类,变成了子类
 * 结合关键字instanceof 就可以判断一个引用所指向的对象 是否实现了这个空接口
 * 引用 instanceof 空接口名
 *      如果实现了空接口,就做一些操作
 *      如果没有实现空接口,就做另外一些操作
 *
 * 实际上Object类当中clone方法底层就是这么实现的,就是利用instanceof来判断是否进行克隆操作.
 * 像"java.lang.Cloneable"这种没有任何成员的空接口,实现它实际上相当于做了一种标记
 * 实现"java.lang.Cloneable",就是把该类标记成可以做克隆操作的类
 * "java.lang.Cloneable"这种空接口,就称之为标记接口
 *
 *
 * @since 17:44
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        A a = new A();
        judgeInstanceImplEmptyInterface(a);
    }

    public static void judgeInstanceImplEmptyInterface(Object o) {
        if (o instanceof EmptyInterface) {
            // o指向的对象,一定是接口的子类对象,o指向的对象的类型,一定实现了这个接口
            System.out.println("实现了空接口,允许做xxx操作!");
            return;
        }
        // 没有实现空接口
        System.out.println("没有实现空接口,禁止做xxx操作!抛出异常!!");
    }
}

class A implements EmptyInterface {

}

// 空接口
interface EmptyInterface {

}